unit UProcConsumoClassProd;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, URotinasBase, ComCtrls, StdCtrls, Buttons, ExtCtrls, ToolEdit,
  Mask;

type
  TFProcConsumoClassProd = class(TFRotinasBase)
    Label1: TLabel;
    edDataIni: TDateEdit;
    Label3: TLabel;
    edDataFim: TDateEdit;
    Label2: TLabel;
    edCaminhoNome: TComboEdit;
    procedure BtnExecClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FProcConsumoClassProd: TFProcConsumoClassProd;

const
  mask_data = 'yyyymmdd';
  mask_valor = '000000000000000.00';

implementation

uses UGeral, DB;

{$R *.dfm}

procedure TFProcConsumoClassProd.BtnExecClick(Sender: TObject);
const
  ctPesquisa =
    'SELECT'#10+
    '  COALESCE(ITENSMOVIMENTOESTOQUE.ITENSMOVEST_QUANTIDADE * ITENSMOVIMENTOESTOQUE.ITENSMOVEST_VALORC,0) AS VALOR,'#10+
    '  MOVIMENTOESTOQUE.MOVEST_DATALANCAMENTO,'#10+
    '  MOVIMENTOESTOQUE.MOVEST_OBS AS HISTORICO_1,'#10+
    '  CCON.PLANOCONT_CODIGOCONTABIL AS CC_CONSUMO,'#10+
    '  CEST.PLANOCONT_CODIGOCONTABIL AS CC_ESTOQUE,'#10+
    '  TIPOMOVIMENTOESTOQUE.TIPMOVEST_DESCRICAO,'#10+
    '  TIPOMOVIMENTOESTOQUE.TIPMOVEST_ENTRADASAIDA'#10+
    'FROM'#10+
    '  MOVIMENTOESTOQUE'#10+
    '  INNER JOIN ITENSMOVIMENTOESTOQUE ON (MOVIMENTOESTOQUE.MOVEST_CODIGO = ITENSMOVIMENTOESTOQUE.ITENSMOVEST_MOVIMENTOESTOQUE)'#10+
    '  INNER JOIN TIPOMOVIMENTOESTOQUE ON (MOVIMENTOESTOQUE.MOVEST_TIPOMOVIMENTO = TIPOMOVIMENTOESTOQUE.TIPMOVEST_CODIGO)'#10+
    '                                 AND (TIPOMOVIMENTOESTOQUE.TIPOMOVEST_INTEGRACAO = ''M'')'#10+ // Movimento Estoque
    '  INNER JOIN PRODUTO ON (ITENSMOVIMENTOESTOQUE.ITENSMOVEST_PRODUTO = PRODUTO.PROD_CODIGO)'#10+
    '  INNER JOIN CLASSIFICACAOPRODUTO ON (PRODUTO.PROD_CLASSIFPROD1 = CLASSIFICACAOPRODUTO.CLASS_PROD_CODIGO)'#10+
    '  INNER JOIN PLANOCONTABILIDADE CCON ON (CCON.PLANOCONT_CODIGO = CLASSIFICACAOPRODUTO.CLASS_PROD_CONTACONTABIL_REC)'#10+
    '  INNER JOIN PLANOCONTABILIDADE CEST ON (CEST.PLANOCONT_CODIGO = CLASSIFICACAOPRODUTO.CLASS_PROD_CONTACONTABIL_EST)'#10+
    'WHERE'#10+
    '  (MOVIMENTOESTOQUE.EXCLUIDO <> ''S'' OR MOVIMENTOESTOQUE.EXCLUIDO IS NULL) AND'#10+
    '  (MOVIMENTOESTOQUE.MOVEST_LOTE_ATUALIZADO = ''S'') AND '#10+ //AND (ITENSMOVIMENTOESTOQUE.ITENSMOVEST_PRODUTO = 35)
    '  (MOVIMENTOESTOQUE.MOVEST_DATALANCAMENTO >= %s) AND (MOVIMENTOESTOQUE.MOVEST_DATALANCAMENTO <= %s)'#10+
    'ORDER BY'#10+
    '  TIPOMOVIMENTOESTOQUE.TIPMOVEST_ENTRADASAIDA,'#10+
    '  MOVIMENTOESTOQUE.MOVEST_DATALANCAMENTO,'#10+
    '  CCON.PLANOCONT_CODIGOCONTABIL,'#10+
    '  CEST.PLANOCONT_CODIGOCONTABIL';

var
  data, nf, serie, conta1, conta2, hist1, hist2 : variant;
  ProxData, ProxConta1, ProxConta2 : variant;
  valorT  : real;
  Arq : TextFile;
  chave, chave2 : string;

begin

  valorT := 0;

  if Usando_Query_Pesquisa(Format(ctPesquisa, [QuotedStr(FormatDateTIme('mm/dd/yyyy', edDataIni.Date)),
                                               QuotedStr(FormatDateTIme('mm/dd/yyyy', edDataFim.Date))])) then
  begin

    Query_Pesquisa.First;

    ProgressBar.Max      := Query_Pesquisa.RecordCount;
    ProgressBar.Position := 0;

    AssignFile(arq, edCaminhoNome.Text);
    Rewrite(arq);

    while not(Query_Pesquisa.Eof) do
    begin

      data   := FormatDateTime(mask_data, Query_Pesquisa.FieldByName('MOVEST_DATALANCAMENTO').AsDateTime);

      if Query_Pesquisa.FieldByName('TIPMOVEST_ENTRADASAIDA').AsString = 'Saida' then
      begin
        conta1 := AlinhaTexto2(Query_Pesquisa.FieldByName('CC_CONSUMO').AsString, 'E', 20);
        conta2 := AlinhaTexto2(Query_Pesquisa.FieldByName('CC_ESTOQUE').AsString, 'E', 20);
      end else begin
        conta1 := AlinhaTexto2(Query_Pesquisa.FieldByName('CC_ESTOQUE').AsString, 'E', 20);
        conta2 := AlinhaTexto2(Query_Pesquisa.FieldByName('CC_CONSUMO').AsString, 'E', 20);
      end;

      chave  := data + conta1 + conta2;

      valorT := valorT + Query_Pesquisa.FieldByName('VALOR').AsFloat;
      hist1  := copy( Trim(Query_Pesquisa.FieldByName('TIPMOVEST_DESCRICAO').AsString) + Space2(40), 1, 40);

      ProgressBar.StepBy(1);
      Query_Pesquisa.Next;

      // Pega proxima chave
      ProxData   := FormatDateTime(mask_data, Query_Pesquisa.FieldByName('MOVEST_DATALANCAMENTO').AsDateTime);

      if Query_Pesquisa.FieldByName('TIPMOVEST_ENTRADASAIDA').AsString = 'Saida' then
      begin
        ProxConta1 := AlinhaTexto2(Query_Pesquisa.FieldByName('CC_CONSUMO').AsString, 'E', 20);
        ProxConta2 := AlinhaTexto2(Query_Pesquisa.FieldByName('CC_ESTOQUE').AsString, 'E', 20);
      end else begin
        ProxConta1 := AlinhaTexto2(Query_Pesquisa.FieldByName('CC_ESTOQUE').AsString, 'E', 20);
        ProxConta2 := AlinhaTexto2(Query_Pesquisa.FieldByName('CC_CONSUMO').AsString, 'E', 20);
      end;

      chave2 := ProxData + ProxConta1 + ProxConta2;
      // Fim - 

      if chave <> chave2 then
      begin

          Writeln(arq, data   +
                       conta1 +
                       conta2 +
                       FormatFloat(mask_valor, valorT) +
                       hist1  +
                       Space2(40));

        valorT := 0;

      end;

    end;

    CloseFile(Arq);
    ShowMessage('Arquivo gerado com sucesso!');

  end else begin

    ShowMessage('Nenhum registro encontrado!');
    Exit;

  end;

  inherited;
  gravaIni(Self.Name + intToStr(UsuarioCodigo), edDataIni.Name, DateToStr(edDataIni.Date));
  gravaIni(Self.Name + intToStr(UsuarioCodigo), edDataFim.Name, DateToStr(edDataFim.Date));
  gravaIni(Self.Name + intToStr(UsuarioCodigo), edCaminhoNome.Name, edCaminhoNome.Text);

  Close;

end;

procedure TFProcConsumoClassProd.FormShow(Sender: TObject);
begin
  inherited;
  if leIni(Self.Name + intToStr(UsuarioCodigo), edDataIni.Name) <> '' then
    edDataIni.Date := strToDate(leIni(Self.Name + intToStr(UsuarioCodigo), edDataIni.Name));

  if leIni(Self.Name + intToStr(UsuarioCodigo), edDataFim.Name) <> '' then
    edDataFim.Date := strToDate(leIni(Self.Name + intToStr(UsuarioCodigo), edDataFim.Name));

  edCaminhoNome.Text := leIni(Self.Name + intToStr(UsuarioCodigo), edCaminhoNome.Name);

end;

procedure TFProcConsumoClassProd.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  FProcConsumoClassProd.Release;
  FProcConsumoClassProd := Nil;
  inherited;

end;

end.
